package main

import (
	"fmt"
)

type HeroNode struct {
	no       int
	name     string
	nickname string
	pre      *HeroNode
	next     *HeroNode
}

func InsertHeroNode(head *HeroNode, newHeroNode *HeroNode) {
	temp := head
	flag := true
	for {
		if temp.next == nil {
			break
		} else if temp.next.no >= newHeroNode.no {
			//说明newHeroNode 就应该插入到temp后面
			break
		} else if temp.next.no == newHeroNode.no {
			flag = false
			break
		}
		temp = temp.next
	}
	if !flag {
		fmt.Println("对不起，已经存在no=", newHeroNode.no)
		return
	} else {
		//temp.next = newHeroNode
		//newHeroNode.pre = temp
		newHeroNode.next = temp.next
		newHeroNode.pre = temp
		if temp.next != nil {
			temp.next.pre = newHeroNode
		}
		temp.next = newHeroNode
	}
}

//删除一个节点【双向列表删除一个节点】
func DelHeroNode(head *HeroNode, id int) {
	temp := head
	flag := false
	for {
		if temp.next == nil {
			break
		} else if temp.next.no == id {
			flag = true
			break
		}
		temp = temp.next
	}
	if flag {
		temp.next = temp.next.next
		if temp.next != nil {
			temp.next.pre = temp
		}

	}
}

//显示链表的所有节点信息
func ListHeroNode(head *HeroNode) {
	//1、创建一个辅助节点
	temp := head

	//2、先判断该链表是不是一个空链表
	if temp.next == nil {
		fmt.Println("该链表为空")
		return
	}

	//3、遍历该链表
	for {
		fmt.Printf("[%d, \t%s,\t%s]--->\n", temp.next.no, temp.next.name, temp.next.nickname)
		//判断是否为链表最后
		temp = temp.next
		if temp.next == nil {
			break
		}
	}
}

//显示链表的所有节点信息
func ListHeroNodeDesc(head *HeroNode) {
	//1、创建一个辅助节点
	temp := head
	//2、先判断该链表是不是一个空链表
	if temp.next == nil {
		fmt.Println("该链表为空")
		return
	}
	//3、让temp定位到双向链表的最后一个节点
	for {
		if temp.next == nil {
			break
		}
		temp = temp.next
	}

	//4、遍历该链表
	for {
		fmt.Printf("[%d, \t%s,\t%s]--->\n", temp.no, temp.name, temp.nickname)
		//判断是否为链表最后
		temp = temp.pre
		if temp.pre == nil {
			break
		}
	}
}

func main() {
	head := &HeroNode{}
	hero1 := &HeroNode{
		no:       1,
		name:     "宋江",
		nickname: "及时雨",
	}
	hero2 := &HeroNode{
		no:       2,
		name:     "卢俊义",
		nickname: "玉麒麟",
	}
	hero3 := &HeroNode{
		no:       3,
		name:     "林冲",
		nickname: "豹子头",
	}
	InsertHeroNode(head, hero1)
	InsertHeroNode(head, hero2)
	InsertHeroNode(head, hero3)
	ListHeroNode(head)
	DelHeroNode(head, 3)
	ListHeroNodeDesc(head)
}
